package com.probiz.estore.product.service;

import com.probiz.estore.common.model.catalog.ProductCategory;
import com.probiz.estore.common.model.content.Content;
import com.probiz.estore.common.model.product.Product;
import com.probiz.estore.product.model.ProductSearchCriteria;
import com.probiz.estore.core.search.SearchCriteria;
import com.probiz.estore.core.service.GenericManager;

import java.util.List;

import javax.servlet.http.HttpSession;

/**
 * Manager interface for Product, responsible for business processing, and
 * communicate between web and persistence layer.
 */
public interface ProductManager extends GenericManager<Product> {
    /**
     * 根据目录id获得直接所属产品个数
     *
     * @param categoryId
     * @return
     */
    public Integer countProductByCategoryId(Integer categoryId);

    /**
     * 根据目录获得所属产品个数,包括子孙目录的产品
     *
     * @param productCategory 产品目录
     * @return Integer 产品总数
     */
    public Integer countProductIncludeAllByCategory(ProductCategory productCategory);

    /**
     * 根据目录获得激活所属产品个数,包括子孙目录的产品
     *
     * @param productCategory 产品目录
     * @return 产品总数
     */
    public Integer countActiveProductIncludeAllByCategory(ProductCategory productCategory);

    /**
     * 根据产品编码查找产品
     *
     * @param productCode 产品编码
     * @return 产品
     */
    public Product getProductByProductCode(String productCode);
    
    /**
     * 根据商品编码找出商品个数，但该商品的不能是参数id所指定的商品
     *
     * @param productCode 产品编码
     * @param productId 商品id
     * @return 个数
     */
    public Long getSizeByProductCodeByNotProductId(String productCode,Integer productId);

    /**
     * 搜索产品
     *
     * @param productSearchCriteria 自定义搜索条件
     * @param searchCriteria        分页搜索条件
     * @return 搜索结果
     */
    public List<Product> searchByCriteria(ProductSearchCriteria productSearchCriteria, SearchCriteria searchCriteria);

    /**
     * 搜索产品，从GenericController借鉴过来。防止翻页过钱
     *
     * @param productSearchCriteria 自定义搜索条件
     * @param searchCriteria        分页搜索条件
     * @return 搜索结果
     */
    public List<Product> searchByCriteriaForController(ProductSearchCriteria productSearchCriteria, SearchCriteria searchCriteria);
  

    /**
     * 根据前台uri获得产品id
     *
     * @param uri 前台uri
     * @return 产品id
     */
    public Integer getProductIdByUri(String uri);

    /**
     * 根据产品获得前台uri
     *
     * @param product 产品
     * @return uri
     */
    public String getUriByProduct(Product product);
    
    /**
     * 根据产品获得前台商品评论uri
     *
     * @param product 产品
     * @return uri
     */
    public String getReviewUriByProduct(Product product);
    /**
     * 根据产品获得前台商品咨询uri
     *
     * @param product 产品
     * @return uri
     */
    public String getConsultUriByProduct(Product product);
    
    /**
     * 根据产品获得前台商品缺货通知uri
     *
     * @param product 产品
     * @return uri
     */
    public String getStockNotifyUriByProduct(Product product);

    /**
     * 根据产品目录和显示标志获得产品列表
     *
     * @param categoryId  产品目录id
     * @param displayFlag 显示标志 new Product.DISPLAYFLAG_NEW;  hot Product.DISPLAYFLAG_HOT
     * @param size        最多显示个数
     * @return List<Product>
     */
    public List<Product> getProductsByCategoryAndDisplayFlag(final Integer categoryId, final Short displayFlag, final int size);
    /**
     * 获取指定数量的随机上架商品
     * @param count
     * @return
     */
    public List<Product> getRandomProductList(int count);
    
    /**
     * 获得平台商品总数
     * @return
     */
    public Long countProductTotal();
    /**
     * 获得平台上架商品总数
     * @return
     */
    public Long countShelvedProductTotal();
    /**
	 * 根据fieldName改变产品统计对应field的值。count为改变数量，可以为正，也可以为负。
	 */
	public void updateStatField(final Integer productStatId,final String fieldName,final Integer count);
   
	/**
	 * 获得所以未删除状态的数据，导出时用到
	 * @return
	 */
	public List<Product> getListByDelete();
}
